//package com.terry.sp.web;
//
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.concurrent.CopyOnWriteArraySet;
//
///**
// * # WS client example
// * <p>
// * import asyncio
// * import websockets
// * <p>
// * <p>
// * async def hello():
// * name = "terry"
// * <p>
// * async with websockets.connect('ws://localhost:8080/websocket/'+name) as websocket:
// * while True:
// * number = input("What's your number? ")
// * if number != 'Q':
// * await websocket.send(number)
// * greeting = await websocket.recv()
// * print(f"< {greeting}")
// * else:
// * break
// * <p>
// * asyncio.get_event_loop().run_until_complete(hello())
// */
//
//@Slf4j
//@Component
//@ServerEndpoint("/websocket/{deviceId}")
//public class WebsocketServer {
//
//    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。
//    static CopyOnWriteArraySet<WebsocketServer> webSocketSet = new CopyOnWriteArraySet<>();
//
//    //与某个客户端的连接会话，需要通过它来给客户端发送数据
//    private Session session;
//
//    private String deviceId = "";
//
//    String getDeviceId() {
//        return this.deviceId;
//    }
//
//    /**
//     * 连接建立成功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session, @PathParam("deviceId") String deviceId) {
//        log.info("有新设备上线:" + deviceId);
//        this.session = session;
//        webSocketSet.add(this);
//        this.deviceId = deviceId;
//
//        try {
//            sendMessage(String.format("你好{%s}", this.deviceId));
//            // 去服务器上查询自己的任务，然后发送到客户端 ==> 这个工作留给http去做, 这里只做实时数据从服务器端往客户端发送的任务.
//
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        webSocketSet.remove(this);
//        log.info("一个连接关闭!");
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message 客户端发送过来的消息
//     */
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        log.info("收到来自" + deviceId + "的消息" + message);
//        try {
//            sendMessage("back==>" + message);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//
//    /**
//     * 发送错误的方法
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//        log.error("发生错误");
////        error.printStackTrace();
//    }
//
//    /**
//     * 实现服务器主动推送
//     */
//    public void sendMessage(String message) throws IOException {
//        this.session.getBasicRemote().sendText(message);
//    }
//
//    /**
//     * 群发自定义消息
//     */
//    public static void sendInfo(String message, @PathParam("deviceId") String deviceId) throws IOException {
//        log.info("推送消息到窗口" + deviceId + "，推送内容:" + message);
//        for (WebsocketServer item : webSocketSet) {
//            try {
//                // 这里可以设定只推送给这个sid的，为null则全部推送
//                if (deviceId == null) {
//                    item.sendMessage(message);
//                } else if (item.deviceId.equals(deviceId)) {
//                    item.sendMessage(message);
//                }
//            } catch (IOException e) {
//                continue;
//            }
//        }
//    }
//}
